/*
 * Copyright 2011 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.web.bindery.requestfactory.apt;

import com.google.web.bindery.requestfactory.shared.JsonRpcService;
import com.google.web.bindery.requestfactory.shared.RequestContext;
import com.google.web.bindery.requestfactory.shared.RequestFactory;
import com.google.web.bindery.requestfactory.shared.Service;
import com.google.web.bindery.requestfactory.shared.ServiceName;
import com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext;

interface MyRequestFactory extends RequestFactory {

  @Expect(method = "contextMustBeAnnotated", args = "ReferencedContextWithoutMapping")
  interface ReferencedContextWithoutMapping extends RequestContext {
  }

  // No error expected
  interface UnreferencedContextWithoutMapping extends RequestContext {
  }

  @Expected({
      @Expect(method = "redundantAnnotation", args = "ServiceName"),
      @Expect(method = "redundantAnnotation", args = "JsonRpcService")})
  @Service(Object.class)
  @ServiceName("java.lang.Object")
  @JsonRpcService
  interface UnreferencedContextWithRedundantMapping extends RequestContext {
  }

  @Expect(method = "factoryMustReturnInterface", args = "AbstractRequestContext")
  AbstractRequestContext concreteContext();

  ReferencedContextWithoutMapping shouldError();

  @Expected({
      @Expect(method = "factoryNoMethodParameters"),
      @Expect(method = "factoryMustBeAssignable", args = "RequestContext")})
  String stringMethod(String bad);
}